<?php
/*如果在未排序的数组中查找最小值，思路如下：
(1) 将数组第一个元素赋值给一个变量，把这个变量作为最小值。
(2) 开始遍历数组，从第二个元素开始依次同当前最小值进行比较。
(3) 如果当前元素数值小于当前最小值，则将当前元素设为新的最小值。
(4) 移动到下一个元素，并且重复步骤 3。
(5) 当程序结束时，这个变量中存储的就是最小值。*/
function searchmin($arr)
{
   if(!count($arr) || (count($arr) == 1)){
       return $arr;
   }
   $current_min = $arr[0];
   for ($i=1;$i<count($arr);$i++){
       if($arr[$i]<=$current_min){
           $current_min = $arr[$i];
       }
   }
   return $current_min;
}
$b = [4,3,9,6,1,5,7,2];
echo searchmin($b);
/*
 * 对于未排序的数组来说，当被查找的数据位于数组的起始位置时，查找是最快、最成功的。
 * 通过将成功找到的元素置于数据集的起始位置，可以保证在以后的操作中该元素能被更快地查找到。
 * 该策略背后的理论是：通过将频繁查找到的元素置于数组的起始位置来最小化查找次数。
 * 比如，一个元素经常被访问，可以把这个元素放在数组的最前面，经过多次查找后，查找最频繁的元素会从原来的位置移动到数组的起始位置。
 * 这就是数据的自组织——数据的位置并非由程序员在程序执行之前组织好的，而是在程序运行过程中由程序自动组织的。
 * 这种对数据的查找遵循“80-20 原则”，即对某一数据集执行的 80% 的查找操作都是对其中 20% 的数据元素进行查找。
 * 自组织的方式最终会把这 20% 的数据置于数据集的起始位置，这样便可以通过一个简单的顺序查找快速找到它们。
 * */
// 包含自组织方式的 seqSearch() 函数
function seqSearch(&$arr, $data) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i] == $data) {
            if ($i > 0) {
                swap($arr, $i, $i - 1);
            }
            return true;
        }
    }
    return false;
}

function swap(&$arr, $a, $b) {
    $temp = $arr[$a];
    $arr[$a] = $arr[$b];
    $arr[$b] = $temp;
    return $arr;
}

// 观察 66 被连续查找 3 次之后是如何冒泡到列表前面去的
$arr = array(1, 78, 4, 66, 25, 39, 3);
for ($i = 1; $i <= 3; $i++) {
    seqSearch($arr, 66);
    print_r($arr);
    echo '<br>';
}
// 输出结果如下：
// 1, 78, 66, 4, 25, 39, 3
// 1, 66, 78, 4, 25, 39, 3
// 66, 1, 78, 4, 25, 39, 3